
/**   this指向绑定5种规则  ***/

/* 1 默认绑定（独立函数调用） 
   规则：当函数作为普通函数调用，this指向全局对象（浏览器中为Window,Node.js中为global）。严格模式下为undefined
*/
function show() {
  console.log(this);
}

show(); // 浏览器输出: Window {...}

/* 2 隐式绑定（方法调用）
   规则：当函数作为对象方法的调用时，this指向调用该方法的对象
 */
const obj = {
  name: 'Alice',
  greet: function () {
    console.log(this.name);
  }
};
obj.greet(); // 输出: "Alice"

/* 3 显示绑定（bind/apply/call） 
   规则：通过call、bind、apply强制指定this指定值
 */
function sayHi() {
  console.log(this.name);
}

const person = { name: 'Bob' };

sayHi.call(person); // 输出: "Bob"

/* 4 new绑定（构造函数）
   规则：使用new调用构造函数时，this指向新创建的对象实例
 */
function Person(name) {
  this.name = name;
}
const john = new Person('John');
console.log(john.name); // 输出: "John"

/* 5 箭头函数 
   规则：箭头函数没有自己的this，它继承定义时所在作用域的this值
 */
const obj2 = {
  name: 'Alice',
  greet: () => {
    console.log(this?.name); // 这里的 this 是外层作用域的 this
  }
};

obj2.greet(); 